package Bricklink; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import Bricklink.org.kleini.bricklink.api.BrickLinkClient; import Bricklink.org.kleini.bricklink.api.Catalog.SubsetsRequest; import Bricklink.org.kleini.bricklink.api.Catalog.SubsetsResponse; import Bricklink.org.kleini.bricklink.data.ColorT; import Bricklink.org.kleini.bricklink.data.EntryDT; import Bricklink.org.kleini.bricklink.data.ItemType; import Bricklink.org.kleini.bricklink.data.OrderDT; import Bricklink.org.kleini.bricklink.data.SubsetDT; import Command.LDrawColorT; import Command.LDrawPart; import Common.Box3; import Common.Vector3f; import Connectivity.GlobalConnectivityManager; import Exports.CompatiblePartManager; import Exports.PartColors; import Exports.PartDomainT; import Exports.PartIds; import LDraw.Support.ColorLibrary; import LDraw.Support.MatrixMath; import LDraw.Support.PartCache; import LDraw.Support.type.LDrawGridTypeT; import Window.MOCBuilder; public class SetImporterFromBricklink { private static SetImporterFromBricklink _instance = null; // public static void main(String args[]) { // SetImporterFromBricklink.getInstance().getPartNoListFrom("30024-1"); // } private SetImporterFromBricklink() { } public synchronized static SetImporterFromBricklink getInstance() { if (_instance == null) _instance = new SetImporterFromBricklink(); return _instance; } public boolean getPartNoListFrom(String setNo) { if (setNo != null) { if (setNo.contains("-") == false) { setNo += "-1"; } } BrickLinkClient client = BricklinkAPI.getInstance() .getClientForOpenAPI(); CompatiblePartManager compatibleManager = CompatiblePartManager .getInstance(); SubsetsRequest request = new SubsetsRequest(ItemType.SET, setNo); ArrayList<LDrawPart> partList = new ArrayList<LDrawPart>(); try { SubsetsResponse response = client.execute(request); for (SubsetDT subsetDT : response.getSubsets()) { for (EntryDT entryDT : subsetDT.getEntries()) { if (entryDT.getItem().getType() .equals(ItemType.PART.toString()) == false && entryDT.getItem().getType() .equals(ItemType.MINIFIG.toString()) == false) continue; String bricklinkPartNo = entryDT.getItem().getItemNo() .toLowerCase(); // System.out.println(bricklinkPartNo); int quantity = entryDT.getQuantity(); ColorT bricklinkColor = entryDT.getColor(); PartIds partIds = compatibleManager.getPartIds( PartDomainT.BRICKLINK, bricklinkPartNo); if (partIds != null) { ArrayList<String> ldrawPartNameList = partIds .getId(PartDomainT.LDRAW); if (ldrawPartNameList == null) { ldrawPartNameList = new ArrayList<String>(); String candidateBricklinkPartName = null; if (bricklinkPartNo.contains("c")) { boolean isEndWithColorCode = true; for (int i = bricklinkPartNo.lastIndexOf("c") + 1; i < bricklinkPartNo .length(); i++) { if (bricklinkPartNo.charAt(i) < '0' || bricklinkPartNo.charAt(i) > '9') isEndWithColorCode = false; } if (isEndWithColorCode) candidateBricklinkPartName = bricklinkPartNo .substring(0, bricklinkPartNo .lastIndexOf("c")); } if (candidateBricklinkPartName != null) { System.out.println("CandidatePartName: " + candidateBricklinkPartName + "(" + bricklinkPartNo + ")"); partIds = compatibleManager.getPartIds( PartDomainT.BRICKLINK, candidateBricklinkPartName); if (partIds != null) ldrawPartNameList.addAll(partIds .getId(PartDomainT.LDRAW)); } } if (ldrawPartNameList.isEmpty()) { ldrawPartNameList.add(bricklinkPartNo); compatibleManager.updateIdMappingInfoFromBricklink( bricklinkPartNo, bricklinkPartNo); } for (String ldrawPartName : ldrawPartNameList) { ldrawPartName += ".dat"; ldrawPartName = PartCache.getInstance() .getRepresentPartName(ldrawPartName); PartColors color = compatibleManager.getPartColors( PartDomainT.BRICKLINK, bricklinkColor.getIdentifier()); Integer ldrawColorValue = null; if (color != null) ldrawColorValue = color .getColorId(PartDomainT.LDRAW); if (ldrawColorValue == null) { ldrawColorValue = LDrawColorT.LDrawCurrentColor .getValue(); } for (int i = 0; i < quantity; i++) { LDrawPart part = new LDrawPart(); part.initWithPartName(ldrawPartName, new Vector3f(0, 0, 0)); part.setLDrawColor(ColorLibrary .sharedColorLibrary() .colorForCode( LDrawColorT .byValue(ldrawColorValue))); MOCBuilder.getInstance() .addDirectiveToWorkingFile(part, false); partList.add(part); } } } } } spreadOutBricks(partList); GlobalConnectivityManager.getInstance().updateMatrixAll(); return true; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } private void spreadOutBricks(ArrayList<LDrawPart> partList) { if (partList.size() == 0) return; Collections.sort(partList, new Comparator<LDrawPart>() { @Override public int compare(LDrawPart o1, LDrawPart o2) { Vector3f sizeO1 = o1.boundingBox3().getMax(); Vector3f sizeO2 = o2.boundingBox3().getMax(); int retValue = new Integer(Math.round(sizeO2.x)).compareTo(Math .round(sizeO1.x)); if (retValue == 0) retValue = o1.displayName().compareTo(o2.displayName()); if (retValue == 0) retValue = o1 .getLDrawColor() .colorCode() .toString() .compareTo( o2.getLDrawColor().colorCode().toString()); return retValue; } }); float totalWidth = 0; for (LDrawPart part : partList) totalWidth += (part.boundingBox3().getMax() .sub(part.boundingBox3().getMin()).x); float widthOfLine = (float) (Math.sqrt(totalWidth / 80) * 80); float widthTemp = 0; int padding = 10; float baseX = -widthOfLine / 2; float baseZ = 0; float maxZ = 0; for (LDrawPart part : partList) { Vector3f sizeOfPart = part.boundingBox3().getMax() .sub(part.boundingBox3().getMin()); Vector3f pos = new Vector3f(baseX + sizeOfPart.x / 2, -LDrawGridTypeT.Coarse.getYValue(), sizeOfPart.z / 2 + baseZ); MOCBuilder.getInstance().moveDirectiveToWithoutConnectivity(part, pos); baseX = part.boundingBox3().getMax().getX() + padding; if (maxZ < sizeOfPart.z) maxZ = sizeOfPart.z; widthTemp += sizeOfPart.x; if (widthTemp > widthOfLine) { baseZ += maxZ + padding; baseX = -widthOfLine / 2; widthTemp = 0; maxZ = 0; } } } }